// this 值的相关问题
// this 在嵌套函数中的问题 1. 最外部被对象所包裹
let b = {
    name: 1,

    user() {
        let name = 'hewensong';
        let sayhi = () => {
            // let name = 'jiangying';
            let a = () => {
                let c = () => {
                    console.log(this.name)
                }
                c();
            }
            a();

        }
        sayhi()
    }
}

// b.user() // 结果为1

// 2. 最外部也是函数的情形
let sayhi = () => {
    // let name = 'jiangying';
    let a = () => {
        let c = () => {
            console.log(this)
        }
        c();
    }
    a();

}
// sayhi()  // this 为undefined 浏览器环境下为window

// 浏览器环境下为window
var name = 'window';

var A = {
    name: 'A',
    sayHello: () => {
        console.log(this.name)
    }
}

// A.sayHello();

let group1 = {
    title: "Our Group",
    students: ["John", "Pete", "Alice"],
    showList() {
        this.students.forEach(function (student) {
            // Error: Cannot read property 'title' of undefined
            console.log(this.title + ': ' + student)
        });
    }
};


let group2 = {
    title: "Our Group",
    students: ["John", "Pete", "Alice"],
    showList() {
        this.students.forEach( (student)=> {
            // Error: Cannot read property 'title' of undefined
            console.log(this.title + ': ' + student)
        });
    }
};

// group.showList();


// foreach回调函数中的this
let obj1 = {
    name: 'hewensong',
    arr: ['he','li'],
    test:()=>{
        // console.log(this)
        this.arr.forEach((item)=>{
            console.log(`${this.name}: ${item}`)
        })
    }
}


// 匿名函数的执行环境具有全局性，因此this对象指向window全局对象
let obj2 = {
    name: 'hewensong',
    arr: ['he','li'],
    test(){
        // console.log(this)
        this.arr.forEach(function(item){
            // console.log(`${this.name}: ${item}`)
            console.log(this) // undefined
        })
    }
}

// obj2.test()

function Person() {
    // Person() 构造函数定义 `this`作为它自己的实例。
    this.age = 0;
  
    setTimeout(function growUp() {
      // 在非严格模式，growUp() 函数定义 `this`作为全局对象，
      // 与在 Person() 构造函数中定义的 `this`并不相同。
      this.age++;
      console.log(this.age)
    }, 1000);

    
  }
  
  var p = new Person();

//   定义在对象里的箭头函数this为什么不指向这个对象?
// 注意区别作用域与对象的关系，在对象中是无法形成作用域的，函数的作用域链在查找变量时会跳过该对象，去寻找该对象的作用域